package com.hua.designpattern.creational.singleton;

/**
 * 
 * @author joshua
 * 
 *         <pre>
 * 
 * 保证一个类仅有一个实例，并提供一个访问它的全局访问点。
 * 
 * 优点
 * 1.在单例模式中，活动的单例只有一个实例，对单例类的所有实例化得到的都是相同的一个实例。这样就防止其它对象对自己的实例化，确保所有的对象都访问一个实例 
 * 2.单例模式具有一定的伸缩性，类自己来控制实例化进程，类就在改变实例化进程上有相应的伸缩性。 
 * 3.提供了对唯一实例的受控访问。 
 * 4.由于在系统内存中只存在一个对象，因此可以 节约系统资源，当 需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。
 * 
 * 缺点
 * 1.由于单利模式中没有抽象层，因此单例类的扩展有很大的困难
 * 2.单例类的职责过重，在一定程度上违背了“单一职责原则”
 * 
 *   REF:
 *      Bean Scope=single
 *      读配置文件
 * 
 *         </pre>
 *
 */
public class TestSingleton {

	public static void main(String[] args) {
		Singleton singleton1 = Singleton.getInstance();
		Singleton singleton2 = Singleton.getInstance();
		System.out.println(singleton1);
		System.out.println(singleton2);

		SingletonLazyInit singletonLazyInit1 = SingletonLazyInit.getInstance();
		SingletonLazyInit singletonLazyInit2 = SingletonLazyInit.getInstance();
		System.out.println(singletonLazyInit1);
		System.out.println(singletonLazyInit2);

		SingletonSafe singletonSafe1 = SingletonSafe.getInstance();
		SingletonSafe singletonSafe2 = SingletonSafe.getInstance();
		System.out.println(singletonSafe1);
		System.out.println(singletonSafe2);

		SingletonStatic singletonStatic1 = SingletonStatic.getInstance();
		SingletonStatic singletonStatic2 = SingletonStatic.getInstance();
		System.out.println(singletonStatic1);
		System.out.println(singletonStatic2);
	}

}
